package com.cino.demos.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * 自定义审计日志保存服务
 * 用于测试targetMethod功能
 */
@Slf4j
@Service
public class CustomLogService {

    /**
     * 自定义用户创建日志保存方法
     */
    public void saveUserCreateLog(String objectId, String objectType, String content, String operationType, Object[] methodArgs, Object returnValue) {
        log.info("=== 自定义CREATE日志保存 ===");
        log.info("操作对象ID: {}", objectId);
        log.info("对象类型: {}", objectType);
        log.info("日志内容: {}", content);
        log.info("操作类型: {}", operationType);
        log.info("方法参数: {}", java.util.Arrays.toString(methodArgs));
        log.info("返回值: {}", returnValue);
        
        // 这里可以实现自定义的日志保存逻辑
        // 例如：保存到不同的数据库、发送到消息队列、写入文件等
        log.info(">>> 自定义CREATE日志已保存到特殊存储！");
    }

    /**
     * 自定义用户更新日志保存方法
     */
    public void saveUserUpdateLog(String objectId, String objectType, String content, String operationType, Object[] methodArgs, Object returnValue) {
        log.info("=== 自定义UPDATE日志保存 ===");
        log.info("操作对象ID: {}", objectId);
        log.info("对象类型: {}", objectType);
        log.info("日志内容: {}", content);
        log.info("操作类型: {}", operationType);
        log.info("方法参数: {}", java.util.Arrays.toString(methodArgs));
        log.info("返回值: {}", returnValue);
        
        // 解析用户信息
        if (methodArgs != null && methodArgs.length > 0 && methodArgs[0] != null) {
            try {
                Object user = methodArgs[0];
                String userName = (String) user.getClass().getMethod("getName").invoke(user);
                log.info("更新的用户名: {}", userName);
            } catch (Exception e) {
                log.warn("解析用户信息失败: {}", e.getMessage());
            }
        }
        
        log.info(">>> 自定义UPDATE日志已保存到特殊存储！");
    }

    /**
     * 通用自定义日志保存方法
     */
    public void saveCustomAuditLog(String objectId, String objectType, String content, String operationType, Object[] methodArgs, Object returnValue) {
        log.info("=== 通用自定义日志保存 ===");
        log.info("操作对象ID: {}", objectId);
        log.info("对象类型: {}", objectType);
        log.info("日志内容: {}", content);
        log.info("操作类型: {}", operationType);
        log.info("方法参数数量: {}", methodArgs != null ? methodArgs.length : 0);
        log.info("返回值类型: {}", returnValue != null ? returnValue.getClass().getSimpleName() : "null");
        
        // 可以根据operationType执行不同的保存策略
        switch (operationType) {
            case "CREATE":
                log.info(">>> 执行CREATE类型的特殊保存逻辑");
                break;
            case "UPDATE":
                log.info(">>> 执行UPDATE类型的特殊保存逻辑");
                break;
            case "DELETE":
                log.info(">>> 执行DELETE类型的特殊保存逻辑");
                break;
            default:
                log.info(">>> 执行默认的保存逻辑");
                break;
        }
        
        log.info(">>> 通用自定义日志已保存！");
    }

    /**
     * 模拟保存到外部系统的方法
     */
    public void saveToExternalSystem(String objectId, String objectType, String content, String operationType, Object[] methodArgs, Object returnValue) {
        log.info("=== 保存到外部系统 ===");
        log.info("准备发送到外部审计系统...");
        
        // 模拟构建外部系统需要的数据格式
        String externalFormat = String.format(
            "{\"objectId\":\"%s\",\"objectType\":\"%s\",\"content\":\"%s\",\"operationType\":\"%s\",\"timestamp\":%d}",
            objectId, objectType, content, operationType, System.currentTimeMillis()
        );
        
        log.info("外部系统数据格式: {}", externalFormat);
        log.info(">>> 已成功发送到外部审计系统！");
    }

    /**
     * 自定义用户删除日志保存方法
     */
    public void saveUserDeleteLog(String objectId, String objectType, String content, String operationType, Object[] methodArgs, Object returnValue) {
        log.info("=== 自定义DELETE日志保存 ===");
        log.info("操作对象ID: {}", objectId);
        log.info("对象类型: {}", objectType);
        log.info("日志内容: {}", content);
        log.info("操作类型: {}", operationType);
        log.info("方法参数: {}", java.util.Arrays.toString(methodArgs));
        log.info("返回值: {}", returnValue);
        
        // 解析用户信息
        if (methodArgs != null && methodArgs.length > 0 && methodArgs[0] != null) {
            try {
                Object user = methodArgs[0];
                String userName = (String) user.getClass().getMethod("getName").invoke(user);
                log.info("删除的用户名: {}", userName);
            } catch (Exception e) {
                log.warn("解析用户信息失败: {}", e.getMessage());
            }
        }
        
        log.info(">>> 自定义DELETE日志已保存到特殊存储！");
    }
}
